package com.hoyue.classroom.controller;

import com.hoyue.classroom.bean.Course;
import com.hoyue.classroom.bean.UserCourse;
import com.hoyue.classroom.service.CourseService;
import com.hoyue.common.utils.*;
import com.hoyue.system.bean.User;
import com.hoyue.system.service.UserService;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.util.List;
import java.util.Map;

/**
 * @author 空白
 * @version 1.0
 * Create by 2019/08/18 22:21
 */
@Controller
@RequestMapping("/course")
public class CourseController {

    private String prefix = "classroom";

    @Autowired
    CourseService courseService;

    @Autowired
    UserService userService;

    /**
     * 跳转到课堂页面
     * @param modelMap
     * @return classroom.html
     * @throws Exception
     */
    @GetMapping("/list")
    public String listCourse(ModelMap modelMap) {
        // 查询当前登录的用户的id
        int userId = ShiroUtils.getUserId();
        // 查询此用户拥有的课程
        List<Course> courses = (List<Course>) ShiroSessionUtils.getShiroAttribute("courseList");
        if (courses == null) {
            courses = courseService.ListCourse(userId);
            ShiroSessionUtils.setShiroAttribute("courseList", courses);
        }
        modelMap.put("courses", courses);
        return prefix + "/classroom";
    }

    /**
     * 跳转到创建课程页面
     * @return 返回add.html文件
     */
    @GetMapping("/add")
    public String add(Model model) {
        String now = DateUtils.getStrTime();
        model.addAttribute("time", now);
        return prefix + "/add";
    }

    /**
     * 创建课程，使用ajax交互，不需要跳转页面（教师拥有权限）
     * @param name 课程名称
     * @param describe 课程介绍
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 1 or 0
     * @throws Exception
     */
    @ResponseBody
    @RequiresRoles("teacher")
    @RequestMapping("/create")
    public RUtils createCourse(String name, String describe, String startTime, String endTime) {
        // 查询当前登录的用户信息
        User user = ShiroUtils.getUser();
        // 为当前教师用户创建课程
        int courseId = courseService.insertCourse(name, describe, startTime, endTime, user.getId(), user.getUserName());
        // 将当前教师与课程绑定
        UserCourse userCourse = new UserCourse(user.getId(), courseId);
        if (courseService.addCourse(userCourse) > 0) {
            // 清空课程缓存
            ShiroSessionUtils.removeShiroAttribute("courseList");
            return RUtils.ok();
        }
        else {
            return RUtils.error(1, "添加失败");
        }
    }

    /**
     * 编辑课程（教师拥有权限）
     * @param id 课程id
     * @return 返回页面
     */
    @RequiresRoles("teacher")
    @GetMapping("/edit/{id}")
    public String editCourse(Model model, @PathVariable(value="id") Integer id) {
        Course course = courseService.getCourse(id);
        Map<String,String> map= courseService.getCourseStr(course);
        for (Map.Entry<String, String> item : map.entrySet()) {
            model.addAttribute(item.getKey(), item.getValue());
        }
        model.addAttribute("id", course.getId());
        return prefix + "/edit";
    }

    /**
     * 更新课程信息（教师拥有权限）
     * @param id
     * @param name
     * @param describe
     * @param startTime
     * @param endTime
     * @return
     */
    @ResponseBody
    @RequiresRoles("teacher")
    @PostMapping("/update")
    public RUtils updateCourse(Integer id, String name, String describe, String startTime, String endTime) {
        if (courseService.updateCourse(id, name, describe, startTime, endTime) > 0) {
            // 清空课程缓存
            ShiroSessionUtils.removeShiroAttribute("courseList");
            return RUtils.ok();
        }
        else {
            return RUtils.error(1, "修改失败");
        }
    }

    /**
     * 删除课程（教师拥有权限）
     * @param id
     * @return 返回一个msg
     */
    @ResponseBody
    @RequiresRoles("teacher")
    @PostMapping("/delete")
    public RUtils delCourse(Integer id) {
        if (courseService.delCourse(id) > 0) {
            // 清空课程缓存
            ShiroSessionUtils.removeShiroAttribute("courseList");
            return RUtils.ok();
        } else {
            return RUtils.error(1, "删除失败");
        }
    }

    /**
     * 加入课程（学生拥有权限）
     * @return
     */
    @GetMapping("/join")
    public String join() {
        return prefix + "/join";
    }

    /**
     * 学生与课程绑定
     * @param id 加密后课程id
     * @return
     */
    @ResponseBody
    @PostMapping("/join")
    public RUtils joinCourse(String id) {
        Integer courseId = Base64Utils.decode(id);
        Integer userId = ShiroUtils.getUserId();
        UserCourse userCourse = new UserCourse(userId, courseId);
        if (courseService.addCourse(userCourse) > 0) {
            // 添加用户id到考勤表中，zhouyong
            courseService.addAttence(userId);
            // 清空课程缓存
            ShiroSessionUtils.removeShiroAttribute("courseList");
            return RUtils.ok();
        }
        else {
            return RUtils.error(1, "添加课程失败");
        }

    }

    /**
     * 退出课程（教师移除学生或学生退出课程，教师、学生都拥有权限）
     * @param id 课程id
     * @return 返回一个msg
     */
    @ResponseBody
    @PostMapping("/out")
    public RUtils outCourse(Integer id) {
        // 查询当前登录的用户id
        Integer userId = ShiroUtils.getUserId();
        if (userId == null) {
            userId = userService.getLoginUser().getId();
        }
        if (courseService.outCourse(userId, id) > 0) {
            // 清空课程缓存
            ShiroSessionUtils.removeShiroAttribute("courseList");
            return RUtils.ok();
        } else {
            return RUtils.error(1, "移除失败");
        }
    }

    /**
     * 接收课程id，并放入session
     * @param id 课程id
     * @param session
     * @return
     */

    @GetMapping("/index/{id}")
    public String cIndex(@PathVariable(value="id") Integer id, HttpSession session) {
        session.setAttribute("courseId", id);
        // 重定向
        return "redirect:/course/index";
    }

    /**
     * 跳转到对应课程的页面
     * @param model
     * @param session
     * @return 课程页面
     */
    @GetMapping("/index")
    public String courseIndex(Model model, HttpSession session) {
        Integer id = (Integer) session.getAttribute("courseId");
        Integer userId = ShiroUtils.getUserId();
        if (userId == null) {
            userId = userService.getLoginUser().getId();
        }
        // 查询此用户拥有的课程
        List<Course> courseList = (List<Course>) ShiroSessionUtils.getShiroAttribute("courseList");
        if (courseList == null) {
            courseList = courseService.ListCourse(userId);
            ShiroSessionUtils.setShiroAttribute("courseList", courseList);
        }
        // 这里不能使用else
        if (courseList != null) {
            for (Course c : courseList) {
                if (c.getId() == id) {
                    model.addAttribute("course", c);
                    session.setAttribute("course", c);
                    break;
                }
            }
            model.addAttribute("courseList", courseList);
        }
        return "course/course";
    }

}
